#ifndef __CPUFLASH_H__
#define __CPUFLASH_H__
/**************Version History***********************/
/*
* Version: 24/10/18
*      Doc: CPUFlsh，借鉴安富莱🙏的cpuflash写成，同时将Flash的随机读写封装好
*           可根据自己的Flash分区和FLash写入要求改变对应的宏
* Author: Sheep
*/
/***************************************************/

#include "stm32f1xx_hal.h"
#include "string.h"

typedef enum
{
    CFE_OK = 0,
    CFE_IS_EQU,      /* Flash内容和待写入的数据相等，不需要擦除和写操作 */
    CFE_REQ_WRITE,       /* Flash不需要擦除，直接写 */
    CFE_REQ_ERASE,       /* Flash需要先擦除,再写 */
    CFE_PARAM_ERR,  	/* 函数参数错误 */
    CFE_FLASH_ERR,     /*Hal内部函数返回错误*/
}CpuFlashErr;



#define CPU_FLASH_BASE_ADDR      (uint32_t)(FLASH_BASE)		/* 0x08000000 */
#define CPU_FLASH_SIZE       	 (256 * 1024)	/*芯片 FLASH总容量 */
#define CPU_FLASH_PAGE_SIZE      (2048)         /*每页的大小*/
//为了保护代码区，这里设置本文件能操作的Flash的起始地址和结束地址(注意不要超过芯片的FLash大小)
#define CPU_FLASH_RESER_SIZE     (64*1024)                                     //本文件预留在前不能读写的FLASH大小
#define CPU_FLASH_START_ADDR     (CPU_FLASH_BASE_ADDR + CPU_FLASH_RESER_SIZE)   //起始地址为基地址+预留的大小
#define CPU_FLASH_WR_SIZE        (192*1024)                                     //本文件可以读写的FLASH大小
#define CPU_FLASH_END_ADDR       (CPU_FLASH_START_ADDR + CPU_FLASH_WR_SIZE)
//是否使能随机写函数，随机写函数需要CPU_FLASH_PAGE_SIZE页大小的缓冲数组作为开销
#define CPU_FLASH_RANDOM_WRITE_ENABLE  0

CpuFlashErr CPUFlash_ChangeUpLimitAddr(uint32_t addr_up_limit);
CpuFlashErr CPUFlash_GetPage(uint32_t address, uint32_t* page_addr);
CpuFlashErr CPUFlash_Read(uint32_t addr, uint8_t * pdst, uint32_t size);
CpuFlashErr CPUFlash_Write_in_A_Page(uint32_t addr, uint8_t * psrc, uint32_t size);
CpuFlashErr CPUFLash_LoadCode(uint32_t flash_addr, uint8_t * psrc, uint32_t size);

#if CPU_FLASH_RANDOM_WRITE_ENABLE
CpuFlashErr CPUFlash_Write(uint32_t flash_addr, uint8_t * psrc, uint32_t size);
#endif

#endif

